/*
 * otorgarPeticion.c
 *
 *  Created on: 27/09/2011
 *      Author: JL
 */

#include "../../Commons/src/includes/BibliotecasGenerales.h"
#include "./includes/funcionesAlgoritmo.h"
#include "./includes/funcionesUtiles.h"
#include "./includes/colasPeticion.h"
#include "./includes/variablesGlobales.h"

uint32_t sectoresAsignadosXDisco(uint32_t numeroDiscos, uint32_t numeroSectores){
	uint32_t n;
		if(numeroDiscos ==0){
	//		printf("No hay discos conectados. Error");
			return 0;
		}
		else {
			n = (numeroSectores / numeroDiscos);
	//		printf("se le asignan %d sectores a cada disco \n", n);
			return n;
		}
}

uint32_t otorgarPeticionDisco(uint32_t sector, uint32_t cantDiscos, uint32_t sectoresPorDisco, desc_PDD_t *vec, uint32_t socket){

	nodo_t nodo;
	uint32_t n;
	uint32_t j=0;
	uint32_t sectoresXDisco;
	uint32_t discosSincronizados = cantDiscos;

	nodo.peticion = sector;
	nodo.flagRW = 0;
	nodo.lonMsj = sizeof(uint32_t);
	nodo.socket = socket;
	strcpy(nodo.mensaje,"");

	if(cantDiscos > 1){
		for(n=0;n<cantDiscos;n++){
			if(vec[n].flagSincro == 0){
				discosSincronizados--;
			};
		};
	};

	sectoresXDisco = sectoresAsignadosXDisco(discosSincronizados, sectoresPorDisco);

	if(sector  < sectoresXDisco){
		if(flagConsola==1){
		printf("Se hace un read en el disco:\n %s \n",desc_PDD[j].identificador);
		};
		agregar(&vec[j].colaFte,&vec[j].colaFin,nodo);
	//	tomarPeticion(&vec[j]);

	}
	else{
		while (sector >= ((sectoresXDisco)*(j+1))){
			j++;
		}
		if(flagConsola==1){
			printf("Se hace un read en el disco:\n %s \n",desc_PDD[j].identificador);
			};
		agregar(&vec[j].colaFte,&vec[j].colaFin,nodo);
	//	tomarPeticion(&vec[j]);
	}
	return j;
}

uint32_t otorgarPeticionDiscoSincro(uint32_t sector, uint32_t cantDiscos, uint32_t sectoresPorDisco, desc_PDD_t *vec){

	nodo_t nodo;
	uint32_t n;
	uint32_t j=0;
	uint32_t sectoresXDisco;
	uint32_t discosSincronizados = cantDiscos;

	nodo.peticion = sector;
	nodo.flagRW = 3;
	nodo.lonMsj = sizeof(uint32_t);
	strcpy(nodo.mensaje,"");

	if(cantDiscos > 1){
		for(n=0;n<cantDiscos;n++){
			if(vec[n].flagSincro == 0){
				discosSincronizados--;
			};
		};
	};

	sectoresXDisco = sectoresAsignadosXDisco(discosSincronizados, sectoresPorDisco);

	if(sector  < sectoresXDisco){
		if(flagConsola==1){
	//	printf("Se hace un read en el disco:\n %s \n",desc_PDD[j].identificador);
		};
		agregar(&vec[j].colaFte,&vec[j].colaFin,nodo);
//		tomarPeticion(&vec[j]);

	}
	else{
		while (sector >= ((sectoresXDisco)*(j+1))){
			j++;
		}
		if(flagConsola==1){
	//	printf("Se hace un read en el disco:\n %s \n",desc_PDD[j].identificador);
		};
		agregar(&vec[j].colaFte,&vec[j].colaFin,nodo);
	}
	return j;
}
